home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
aminet
/
util
/
pack
/
xpk25dev.lha
/
include
/
libraries
/
xpk.h
next >
Wrap
C/C++ Source or Header
|
1992-11-04
|
15KB
|
396 lines
/*
** $Filename: xpk.h $
** $Release: 0.9 $
**
**
**
** (C) Copyright 1991 U. Dominik Mueller, Bryan Ford, Christian Schneider
** All Rights Reserved
*/
#ifndef LIBRARIES_XPK_H
#define LIBRARIES_XPK_H
#ifndef EXEC_TYPES_H
#include <exec/types.h>
#endif
#ifndef EXEC_NODES_H
#include <exec/nodes.h>
#endif
#if INCLUDE_VERSION >= 36
#ifndef UTILITY_TAGITEM_H
#include <utility/tagitem.h>
#endif
#ifndef UTILITY_HOOKS_H
#include <utility/hooks.h>
#endif
#else
typedef ULONG Tag; /* Extracted (without permission) from utility/tagitem.h */
struct TagItem {
Tag ti_Tag;
ULONG ti_Data;
};
#define TAG_DONE (0L) /* terminates array of TagItems. ti_Data unused */
#define TAG_IGNORE (1L) /* ignore this item, not end of array */
#define TAG_USER (1L<<31) /* differentiates user tags from system tags */
struct Hook { /* Likewise, but from utility/hooks.h */
struct MinNode h_MinNode;
ULONG (*h_Entry)(); /* assembler entry point */
ULONG (*h_SubEntry)();/* often HLL entry point */
VOID *h_Data; /* owner specific */
};
#endif
typedef struct TagItem TAGS;
typedef struct Hook * HOOK;
#define XPKNAME "xpkmaster.library"
/*****************************************************************************
*
*
* The packing/unpacking tags
*
*/
#define XPK_TagBase (TAG_USER + 'X'*256 + 'P')
#define XTAG(a) (XPK_TagBase+a)
/* Caller must supply ONE of these to tell Xpk#?ackFile where to get data from */
#define XPK_InName XTAG(0x01) /* Process an entire named file */
#define XPK_InFH XTAG(0x02) /* File handle - start from current position */
/* If packing partial file, must also supply InLen */
#define XPK_InBuf XTAG(0x03) /* Single unblocked memory buffer */
/* Must also supply InLen */
#define XPK_InHook XTAG(0x04) /* Call custom Hook to read data */
/* If packing, must also supply InLen */
/* If unpacking, InLen required only for PPDecrunch */
/* Caller must supply ONE of these to tell Xpk#?ackFile where to send data to */
#define XPK_OutName XTAG(0x10) /* Write (or overwrite) this data file */
#define XPK_OutFH XTAG(0x11) /* File handle - write from current position on */
#define XPK_OutBuf XTAG(0x12) /* Unblocked buffer - must also supply OutBufLen */
#define XPK_GetOutBuf XTAG(0x13) /* Master allocates OutBuf - ti_Data points to buf ptr */
#define XPK_OutHook XTAG(0x14) /* Callback Hook to get output buffers */
/* Other tags for Pack/Unpack */
#define XPK_InLen XTAG(0x20) /* Length of data in input buffer */
#define XPK_OutBufLen XTAG(0x21) /* Length of output buffer */
#define XPK_GetOutLen XTAG(0x22) /* ti_Data points to long to receive OutLen */
#define XPK_GetOutBufLen XTAG(0x23) /* ti_Data points to long to receive OutBufLen */
#define XPK_Password XTAG(0x24) /* Password for de/encoding */
#define XPK_GetError XTAG(0x25) /* ti_Data points to buffer for error message */
#define XPK_OutMemType XTAG(0x26) /* Memory type for output buffer */
#define XPK_PassThru XTAG(0x27) /* Bool: Pass through unrecognized formats on unpack */
#define XPK_StepDown XTAG(0x28) /* Bool: Step down pack method if necessary */
#define XPK_ChunkHook XTAG(0x29) /* Call this Hook between chunks */
#define XPK_PackMethod XTAG(0x2a) /* Do a FindMethod before packing */
#define XPK_ChunkSize XTAG(0x2b) /* Chunk size to try to pack with */
#define XPK_PackMode XTAG(0x2c) /* Packing mode for sublib to use */
#define XPK_NoClobber XTAG(0x2d) /* Don't overwrite existing files */
#define XPK_Ignore XTAG(0x2e) /* Skip this tag */
#define XPK_TaskPri XTAG(0x2f) /* Change priority for (un)packing */
#define XPK_FileName XTAG(0x30) /* File name for progress report */
#define XPK_ShortError XTAG(0x31) /* Output short error messages */
#define XPK_PackersQuery XTAG(0x32) /* Query available packers */
#define XPK_PackerQuery XTAG(0x33) /* Query properties of a packer */
#define XPK_ModeQuery XTAG(0x34) /* Query properties of packmode */
#define XPK_LossyOK XTAG(0x35) /* Lossy packing permitted? def.=no*/
#define XPK_FindMethod XPK_PackMethod /* Compatibility */
#define XPK_MARGIN 256 /* Safety margin for output buffer */
/*****************************************************************************
*
*
* The hook function interface
*
*/
/* Message passed to InHook and OutHook as the ParamPacket */
typedef struct XpkIOMsg {
ULONG Type ; /* Read/Write/Alloc/Free/Abort */
APTR Ptr ; /* The mem area to read from/write to */
LONG Size ; /* The size of the read/write */
LONG IOError ; /* The IoErr() that occurred */
LONG Reserved ; /* Reserved for future use */
LONG Private1 ; /* Hook specific, will be set to 0 by */
LONG Private2 ; /* master library before first use */
LONG Private3 ;
LONG Private4 ;
} XIOMSG;
/* The values for XpkIoMsg->Type */
#define XIO_READ 1
#define XIO_WRITE 2
#define XIO_FREE 3
#define XIO_ABORT 4
#define XIO_GETBUF 5
#define XIO_SEEK 6
#define XIO_TOTSIZE 7
/*****************************************************************************
*
*
* The progress report interface
*
*/
/* Passed to ChunkHook as the ParamPacket */
typedef struct XpkProgress {
LONG Type ; /* Type of report: start/cont/end/abort */
STRPTR PackerName ; /* Brief name of packer being used */
STRPTR PackerLongName ; /* Descriptive name of packer being used */
STRPTR Activity ; /* Packing/unpacking message */
STRPTR FileName ; /* Name of file being processed, if available */
LONG CCur ; /* Amount of packed data already processed */
LONG UCur ; /* Amount of unpacked data already processed */
LONG ULen ; /* Amount of unpacked data in file */
LONG CF ; /* Compression factor so far */
LONG Done ; /* Percentage done already */
LONG Speed ; /* Bytes per second, from beginning of stream */
LONG Reserved[8] ; /* For future use */
} XPROG;
#define XPKPROG_START 1
#define XPKPROG_MID 2
#define XPKPROG_END 3
/*****************************************************************************
*
*
* The file info block
*
*/
struct XpkFib {
LONG Type ; /* Unpacked, packed, archive? */
LONG ULen ; /* Uncompressed length */
LONG CLen ; /* Compressed length */
LONG NLen ; /* Next chunk len */
LONG UCur ; /* Uncompressed bytes so far */
LONG CCur ; /* Compressed bytes so far */
LONG ID ; /* 4 letter ID of packer */
UBYTE Packer[6] ; /* 4 letter name of packer */
WORD SubVersion ; /* Required sublib version */
WORD MasVersion ; /* Required masterlib version */
LONG Flags ; /* Password? */
UBYTE Head[16] ; /* First 16 bytes of orig. file */
LONG Ratio ; /* Compression ratio */
LONG Reserved[8] ; /* For future use */
};
typedef struct XpkFib XFIB;
#define XPKTYPE_UNPACKED 0 /* Not packed */
#define XPKTYPE_PACKED 1 /* Packed file */
#define XPKTYPE_ARCHIVE 2 /* Archive */
#define XPKFLAGS_PASSWORD 1 /* Password needed */
#define XPKFLAGS_NOSEEK 2 /* Chunks are dependent */
#define XPKFLAGS_NONSTD 4 /* Nonstandard file format */
/*****************************************************************************
*
*
* The error messages
*
*/
#define XPKERR_OK 0
#define XPKERR_NOFUNC -1 /* This function not implemented */
#define XPKERR_NOFILES -2 /* No files allowed for this function */
#define XPKERR_IOERRIN -3 /* Input error happened, look at Result2*/
#define XPKERR_IOERROUT -4 /* Output error happened,look at Result2*/
#define XPKERR_CHECKSUM -5 /* Check sum test failed */
#define XPKERR_VERSION -6 /* Packed file's version newer than lib */
#define XPKERR_NOMEM -7 /* Out of memory */
#define XPKERR_LIBINUSE -8 /* For not-reentrant libraries */
#define XPKERR_WRONGFORM -9 /* Was not packed with this library */
#define XPKERR_SMALLBUF -10 /* Output buffer too small */
#define XPKERR_LARGEBUF -11 /* Input buffer too large */
#define XPKERR_WRONGMODE -12 /* This packing mode not supported */
#define XPKERR_NEEDPASSWD -13 /* Password needed for decoding */
#define XPKERR_CORRUPTPKD -14 /* Packed file is corrupt */
#define XPKERR_MISSINGLIB -15 /* Required library is missing */
#define XPKERR_BADPARAMS -16 /* Caller's TagList was screwed up */
#define XPKERR_EXPANSION -17 /* Would have caused data expansion */
#define XPKERR_NOMETHOD -18 /* Can't find requested method */
#define XPKERR_ABORTED -19 /* Operation aborted by user */
#define XPKERR_TRUNCATED -20 /* Input file is truncated */
#define XPKERR_WRONGCPU -21 /* Better CPU required for this library */
#define XPKERR_PACKED -22 /* Data are already XPacked */
#define XPKERR_NOTPACKED -23 /* Data not packed */
#define XPKERR_FILEEXISTS -24 /* File already exists */
#define XPKERR_OLDMASTLIB -25 /* Master library too old */
#define XPKERR_OLDSUBLIB -26 /* Sub library too old */
#define XPKERR_NOCRYPT -27 /* Cannot encrypt */
#define XPKERR_NOINFO -28 /* Can't get info on that packer */
#define XPKERR_LOSSY -29 /* This compression method is lossy */
#define XPKERR_NOHARDWARE -30 /* Compression hardware required */
#define XPKERR_BADHARDWARE -31 /* Compression hardware failed */
#define XPKERR_WRONGPW -32 /* Password was wrong */
#define XPKERRMSGSIZE 80 /* Maximum size of an error message */
/*****************************************************************************
*
*
* The XpkQuery() call
*
*/
typedef struct XpkPackerInfo {
BYTE Name[24] ; /* Brief name of the packer */
BYTE LongName[32] ; /* Full name of the packer */
BYTE Description[80] ; /* One line description of packer */
LONG Flags ; /* Defined below */
LONG MaxChunk ; /* Max input chunk size for packing */
LONG DefChunk ; /* Default packing chunk size */
UWORD DefMode ; /* Default mode on 0..100 scale */
} XPINFO;
/* Defines for Flags */
#define XPKIF_PK_CHUNK 0x00000001 /* Library supplies chunk packing */
#define XPKIF_PK_STREAM 0x00000002 /* Library supplies stream packing */
#define XPKIF_PK_ARCHIVE 0x00000004 /* Library supplies archive packing */
#define XPKIF_UP_CHUNK 0x00000008 /* Library supplies chunk unpacking */
#define XPKIF_UP_STREAM 0x00000010 /* Library supplies stream unpacking */
#define XPKIF_UP_ARCHIVE 0x00000020 /* Library supplies archive unpacking */
#define XPKIF_HOOKIO 0x00000080 /* Uses full Hook I/O */
#define XPKIF_CHECKING 0x00000400 /* Does its own data checking */
#define XPKIF_PREREADHDR 0x00000800 /* Unpacker pre-reads the next chunkhdr */
#define XPKIF_ENCRYPTION 0x00002000 /* Sub library supports encryption */
#define XPKIF_NEEDPASSWD 0x00004000 /* Sub library requires encryption */
#define XPKIF_MODES 0x00008000 /* Sub library has different modes */
#define XPKIF_LOSSY 0x00010000 /* Sub library does lossy compression */
typedef struct XpkMode {
struct XpkMode *Next ; /* Chain to next descriptor for ModeDesc list*/
ULONG Upto ; /* Maximum efficiency handled by this mode */
ULONG Flags ; /* Defined below */
ULONG PackMemory ; /* Extra memory required during packing */
ULONG UnpackMemory ; /* Extra memory during unpacking */
ULONG PackSpeed ; /* Approx packing speed in K per second */
ULONG UnpackSpeed ; /* Approx unpacking speed in K per second */
UWORD Ratio ; /* CF in 0.1% for AmigaVision executable */
UWORD ChunkSize ; /* Desired chunk size in K (!!) for this mode*/
BYTE Description[10]; /* 7 character mode description */
} XMINFO;
/* Defines for XpkMode.Flags */
#define XPKMF_A3000SPEED 0x00000001 /* Timings on A3000/25 */
#define XPKMF_PK_NOCPU 0x00000002 /* Packing not heavily CPU dependent */
#define XPKMF_UP_NOCPU 0x00000004 /* Unpacking... (i.e. hardware modes)*/
#define MAXPACKERS 100
typedef struct XpkPackerList {
ULONG NumPackers;
BYTE Packer[MAXPACKERS][6];
} XPLIST;
/*****************************************************************************
*
*
* The XpkOpen() type calls
*
*/
#define XPKLEN_ONECHUNK 0x7fffffff
#define XpkFH XpkFib
typedef struct XpkFib XFH;
/*****************************************************************************
*
*
* The library vectors
*
*/
#define REG register
#define _a0 register __a0
#define _a1 register __a1
#define _a2 register __a2
#define _a4 register __a4
#define _d0 register __d0
#define _d1 register __d1
#ifndef NO_XPK_PROTOS
LONG XpkExamine ( XFIB *fib, TAGS *tags);
LONG XpkPack ( TAGS *tags );
LONG XpkUnpack ( TAGS *tags );
LONG XpkOpen ( XFH **xfh, TAGS *tags );
LONG XpkRead ( XFH *xfh, UBYTE *buf, LONG len );
LONG XpkWrite ( XFH *xfh, UBYTE *buf, LONG ulen );
LONG XpkSeek ( XFH *xfh, LONG dist, LONG mode );
LONG XpkClose ( XFH *xfh );
LONG XpkQuery ( TAGS *tags );
LONG XpkExamineTags ( XFIB *fib, ULONG, ... );
LONG XpkPackTags ( ULONG, ... );
LONG XpkUnpackTags ( ULONG, ... );
LONG XpkQueryTags ( ULONG, ... );
LONG XpkOpenTags ( XFH **xfh, ULONG, ... );
#ifndef NO_XPK_PRAGMAS
#ifdef LATTICE
# pragma libcall XpkBase XpkExamine 24 9802
# pragma libcall XpkBase XpkPack 2A 801
# pragma libcall XpkBase XpkUnpack 30 801
# pragma libcall XpkBase XpkOpen 36 9802
# pragma libcall XpkBase XpkRead 3C 09803
# pragma libcall XpkBase XpkWrite 42 09803
# pragma libcall XpkBase XpkSeek 48 10803
# pragma libcall XpkBase XpkClose 4E 801
# pragma libcall XpkBase XpkQuery 54 801
#endif
#ifdef AZTEC_C
# pragma amicall(XpkBase, 0x24, XpkExamine(a0,a1))
# pragma amicall(XpkBase, 0x2a, XpkPack(a0))
# pragma amicall(XpkBase, 0x30, XpkUnpack(a0))
# pragma amicall(XpkBase, 0x36, XpkOpen(a0,a1))
# pragma amicall(XpkBase, 0x3c, XpkRead(a0,a1,d0))
# pragma amicall(XpkBase, 0x42, XpkWrite(a0,a1,d0))
# pragma amicall(XpkBase, 0x48, XpkSeek(a0,d0,d1))
# pragma amicall(XpkBase, 0x4e, XpkClose(a0))
# pragma amicall(XpkBase, 0x54, XpkQuery(a0))
#endif
#endif
#endif
#endif /* LIBRARIES_XPK_H */